package services

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"sync"
)

// TemplateConfig 模板配置结构（对应 templates.json）
type TemplateConfig struct {
	Templates  []TemplateInfo `json:"templates"`
	LastUpdated string         `json:"lastUpdated"`
}

// TemplateInfo 模板信息（从 templates.json 读取）
type TemplateInfo struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Category    string `json:"category"`
	Description string `json:"description"`
	Scene       string `json:"scene"`
	FileName    string `json:"fileName"`
	IsBuiltIn   bool   `json:"isBuiltIn"`
}

// TemplateConfigService 模板配置服务
type TemplateConfigService struct {
	configPath string
	config     *TemplateConfig
	mu         sync.RWMutex
}

// NewTemplateConfigService 创建模板配置服务
func NewTemplateConfigService(templatesDir string) *TemplateConfigService {
	configPath := filepath.Join(templatesDir, "templates.json")
	return &TemplateConfigService{
		configPath: configPath,
	}
}

// LoadConfig 加载配置
func (s *TemplateConfigService) LoadConfig() (*TemplateConfig, error) {
	s.mu.RLock()
	if s.config != nil {
		s.mu.RUnlock()
		return s.config, nil
	}
	s.mu.RUnlock()

	s.mu.Lock()
	defer s.mu.Unlock()

	// 双重检查
	if s.config != nil {
		return s.config, nil
	}

	// 读取配置文件
	data, err := os.ReadFile(s.configPath)
	if err != nil {
		// 如果文件不存在，创建默认配置
		if os.IsNotExist(err) {
			s.config = &TemplateConfig{
				Templates:  []TemplateInfo{},
				LastUpdated: "",
			}
			return s.config, nil
		}
		return nil, err
	}

	var config TemplateConfig
	err = json.Unmarshal(data, &config)
	if err != nil {
		return nil, err
	}

	s.config = &config
	return s.config, nil
}

// SaveConfig 保存配置
func (s *TemplateConfigService) SaveConfig(config *TemplateConfig) error {
	s.mu.Lock()
	defer s.mu.Unlock()

	data, err := json.MarshalIndent(config, "", "  ")
	if err != nil {
		return err
	}

	err = os.WriteFile(s.configPath, data, 0644)
	if err != nil {
		return err
	}

	s.config = config
	return nil
}

// GetTemplateInfo 获取模板信息
func (s *TemplateConfigService) GetTemplateInfo(id string) (*TemplateInfo, error) {
	config, err := s.LoadConfig()
	if err != nil {
		return nil, err
	}

	for _, t := range config.Templates {
		if t.ID == id {
			return &t, nil
		}
	}

	return nil, fmt.Errorf("模板不存在: %s", id)
}

// AddTemplateInfo 添加模板信息
func (s *TemplateConfigService) AddTemplateInfo(info TemplateInfo) error {
	config, err := s.LoadConfig()
	if err != nil {
		return err
	}

	// 检查是否已存在
	for i, t := range config.Templates {
		if t.ID == info.ID {
			config.Templates[i] = info
			return s.SaveConfig(config)
		}
	}

	config.Templates = append(config.Templates, info)
	return s.SaveConfig(config)
}

// RemoveTemplateInfo 删除模板信息
func (s *TemplateConfigService) RemoveTemplateInfo(id string) error {
	config, err := s.LoadConfig()
	if err != nil {
		return err
	}

	for i, t := range config.Templates {
		if t.ID == id {
			config.Templates = append(config.Templates[:i], config.Templates[i+1:]...)
			return s.SaveConfig(config)
		}
	}

	return nil
}

// RefreshConfig 刷新配置（重新加载）
func (s *TemplateConfigService) RefreshConfig() {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.config = nil
}

